bitkeeper revision 1.1159.1.42 (411b8205n-7QEGvjIUl4GfoBiiNpcw)
authormjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Thu, 12 Aug 2004 14:43:17 +0000 (14:43 +0000)
committermjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Thu, 12 Aug 2004 14:43:17 +0000 (14:43 +0000)
Destroy domain earlier in migration to allow
migration to localhost.

tools/python/xen/xend/XendMigrate.py
tools/python/xen/xend/server/messages.py
tools/xfrd/xfrd.c
tools/xfrd/xfrd.h

index cc248d427bbe61fb69bdcf1f16f0ee79ce55a89f..b98e5d87fc1c944172ba6f8e5fc6338c5be4ce95 100644 (file)
@@ -1,5 +1,7 @@
 # Copyright (C) 2004 Mike Wray <mike.wray@hp.com>
 
+import traceback
+
 import errno
 import sys
 import socket
@@ -156,6 +158,19 @@ class XfrdInfo:
         print 'xfr_progress>', val
         return None
 
+    def xfr_vm_destroy(self, xfrd, val):
+        print 'xfr_vm_destroy>', val
+        try:
+            vmid = sxp.child0(val)
+            val = self.xd.domain_destroy(vmid)
+            if vmid in self.paused:
+                del self.paused[vmid]
+            if vmid in self.suspended:
+                del self.suspended[vmid]
+        except:
+            val = errno.EINVAL
+        return ['xfr.err', val]
+    
     def xfr_vm_pause(self, xfrd, val):
         print 'xfr_vm_pause>', val
         try:
@@ -221,7 +236,9 @@ class XfrdInfo:
             d.addErrback(cberr)
             d.setTimeout(self.timeout)
             return d
-        except:
+        except Exception, err:
+            print 'xfr_vm_suspend> Exception', err
+            traceback.print_exc()
             val = errno.EINVAL
         return ['xfr.err', val]
 
@@ -401,8 +418,6 @@ class XendMigrate:
         @param port: destination port
         @return: deferred
         """
-        if host in ['localhost', '127.0.0.1']:
-            raise XendError('cannot migrate to localhost')
         # Check dom for existence, not migrating already.
         # Subscribe to migrate notifications (for updating).
         xid = self.nextid()
index c61d3598aef5b21f9b55daf8ba59987bd37384fb..e966ec9003c5b71615cd960f10d10b3a231996b3 100644 (file)
@@ -1,5 +1,6 @@
 import sys
 import struct
+import types
 
 from xen.lowlevel import xu
 
@@ -230,19 +231,22 @@ def unpackMsg(ty, msg):
     @rtype: dict
     """
     args = msg.get_payload()
-    mac = [0, 0, 0, 0, 0, 0]
-    macs = []
-    for (k, v) in args.items():
-        if k.startswith('mac['):
-            macs += k
-            i = int(k[4:5])
-            mac[i] = v
-        else:
-            pass
-    if macs:
-        args['mac'] = mac
-        for k in macs:
-            del args[k]
+    if isinstance(args, types.StringType):
+        args = { 'value': args }
+    else:
+        mac = [0, 0, 0, 0, 0, 0]
+        macs = []
+        for (k, v) in args.items():
+            if k.startswith('mac['):
+                macs += k
+                i = int(k[4:5])
+                mac[i] = v
+            else:
+                pass
+        if macs:
+            args['mac'] = mac
+            for k in macs:
+                del args[k]
     if DEBUG:
         msgid = msg.get_header()['id']
         print '<unpackMsg', msgid, ty, args
index 1b8664b7dabe0dbdc91b00ed329d5538ae259ef6..3d0cfa3e667445977032f04fa4accc7c6ac3c07f 100644 (file)
@@ -100,6 +100,7 @@ Sxpr oxfr_migrate_ok;// (xfr.migrate.ok <value>)
 Sxpr oxfr_progress;  // (xfr.progress <percent> <rate: kb/s>)
 Sxpr oxfr_save;      // (xfr.save <vmid> <vmconfig> <file>)
 Sxpr oxfr_save_ok;   // (xfr.save.ok)
+Sxpr oxfr_vm_destroy;// (xfr.vm.destroy <vmid>)
 Sxpr oxfr_vm_suspend;// (xfr.vm.suspend <vmid>)
 Sxpr oxfr_xfr;       // (xfr.xfr <vmid>)
 Sxpr oxfr_xfr_ok;    // (xfr.xfr.ok <vmid>)
@@ -113,6 +114,7 @@ void xfr_init(void){
     oxfr_progress       = intern("xfr.progress");
     oxfr_save           = intern("xfr.save");
     oxfr_save_ok        = intern("xfr.save.ok");
+    oxfr_vm_destroy     = intern("xfr.vm.destroy");
     oxfr_vm_suspend     = intern("xfr.vm.suspend");
     oxfr_xfr            = intern("xfr.xfr");
     oxfr_xfr_ok         = intern("xfr.xfr.ok");
@@ -566,6 +568,28 @@ int xfr_vm_suspend(Conn *xend, uint32_t vmid){
     return err;
 }
 
+int xfr_send_destroy(Conn *conn, uint32_t vmid){
+    int err = 0;
+
+    err = IOStream_print(conn->out, "(%s %d)",
+                         atom_name(oxfr_vm_destroy), vmid);
+    return (err < 0 ? err : 0);
+}
+
+/** Destroy a vm on behalf of save/migrate.
+ */
+int xfr_vm_destroy(Conn *xend, uint32_t vmid){
+    int err = 0;
+    dprintf("> vmid=%u\n", vmid);
+    err = xfr_send_destroy(xend, vmid);
+    if(err) goto exit;
+    IOStream_flush(xend->out);
+    err = xfr_response(xend);
+  exit:
+    dprintf("< err=%d\n", err);
+    return err;
+}
+
 /** Get vm state. Send transfer message.
  *
  * @param peer connection
@@ -584,6 +608,10 @@ int xfr_send_state(XfrState *state, Conn *xend, Conn *peer){
     err = xen_domain_snd(xend, peer->out,
                          state->vmid, state->vmconfig, state->vmconfig_n);
     if(err) goto exit;
+    // Sending the domain suspends it, and there's no way back.
+    // So destroy it now. If anything goes wrong now it's too late.
+    err = xfr_vm_destroy(xend, state->vmid);
+    if(err) goto exit;
     IOStream_flush(peer->out);
     // Read the response from the peer.
     err = Conn_sxpr(peer, &sxpr);
index 9de464549b3aefa3d814e04f1f5f1489c242e1c5..0671b383eb13a6fcd50fcf9e1d2b8465f093703b 100644 (file)
@@ -13,4 +13,5 @@
 
 struct Conn;
 extern int xfr_vm_suspend(struct Conn *xend, uint32_t vmid);
+extern int xfr_vm_destroy(struct Conn *xend, uint32_t vmid);
 #endif